###############################################################################
# define app file name
###############################################################################
SERVER_NAME = gameserver 


###############################################################################
# define c & c++ compiler
###############################################################################

ifeq ($(c), dist)
C++ = /usr/local/bin/distcc g++
CC = /usr/local/bin/distcc
LINK = /usr/local/bin/distcc 
else
C++ = /usr/local/bin/g++
CC = /usr/local/bin/gcc
LINK = /usr/local/bin/gcc 
endif


###############################################################################
# define c compiler options
###############################################################################
CCFLAGS = -Wall -Werror -gdwarf-2 -g3 -ggdb3 -march=x86-64
ifeq ($(mode), release)
CCFLAGS += -O0
else
CCFLAGS += -DDEBUG -D__TEST_ -D_DHGQ_
endif
CCFLAGS += -I ../pub_libs/xcore/include -I ../pub_libs/xnet/include \
		   -I ../pub_libs/lua5.2.2/include \
		   -I ../pub_libs/libleveldb/x86_64/include -I ../pub_libs/libleveldb/x86_64/include/leveldb \
           -I ./cache -I ./cache/const -I ./common  \
		   -I ./context -I ./db -I ./frame -I ../message/common -I ../message/gameserver -I ./record



###############################################################################
# define c++ compiler options
###############################################################################
C++FLAGS = $(CCFLAGS) 
C++FLAGS += -std=c++11 
LINKFLAGS = -lpthread -lrt -lm -ldl -march=x86-64 
ifeq ($(mode), release)
LINKLIBS =  ../pub_libs/xnet/lib/libxnet.a ../pub_libs/xcore/lib/libxcore.a ../pub_libs/xnet/lib/libmysqlclient.a ../pub_libs/libleveldb/x86_64/lib/libleveldb.a ../pub_libs/lua5.2.2/lib/liblua64.a ../pub_libs/openssl/lib/libssl64.a ../pub_libs/openssl/lib/libcrypto64.a /usr/local/lib64/libstdc++.a
else
LINKLIBS = ../pub_libs/xnet/lib/libxnetD.a ../pub_libs/xcore/lib/libxcoreD.a ../pub_libs/xnet/lib/libmysqlclient.a ../pub_libs/libleveldb/x86_64/lib/libleveldb.a ../pub_libs/lua5.2.2/lib/liblua64.a ../pub_libs/openssl/lib/libssl64.a ../pub_libs/openssl/lib/libcrypto64.a /usr/local/lib64/libstdc++.a  
endif
###############################################################################
# xnet and protocol folder's .cpp files
###############################################################################
CPP_CACHE = $(wildcard cache/*.cpp)
CPP_CACHE_CONST = $(wildcard cache/const/*.cpp)
CPP_COMMON = $(wildcard common/*.cpp)
CPP_CONTEXT = $(wildcard context/*.cpp)
CPP_DB = $(wildcard db/*.cpp)
CPP_FRAME = $(wildcard frame/*.cpp)
CPP_MESSAGE_COMMON = $(wildcard ../message/common/*.cpp)
CPP_MESSAGE_GAME = $(wildcard ../message/gameserver/*.cpp)
CPP_RECORD = $(wildcard record/*.cpp)
CPP_SERVER += $(CPP_CACHE)
CPP_SERVER += $(CPP_CACHE_CONST)
CPP_SERVER += $(CPP_COMMON)
CPP_SERVER += $(CPP_CONTEXT)
CPP_SERVER += $(CPP_DB)
CPP_SERVER += $(CPP_FRAME)
CPP_SERVER += $(CPP_MESSAGE_COMMON)
CPP_SERVER += $(CPP_MESSAGE_GAME)
CPP_SERVER += $(CPP_RECORD)

CPP_SERVER_C = $(wildcard common/sqlite/*.c)

###############################################################################
# compile files
###############################################################################
all: $(SERVER_NAME)
.PHONY: all

$(SERVER_NAME): $(CPP_SERVER:.cpp=.o) $(CPP_SERVER_C:.c=.o) $(LINKLIBS)
	$(LINK) -o $(SERVER_NAME) $(CPP_SERVER:.cpp=.o) $(CPP_SERVER_C:.c=.o) $(LINKLIBS) $(LINKFLAGS) 

sinclude $(CPP_SERVER:.cpp=.d)

.PHONY: clean
clean:
	-rm -f $(CPP_SERVER:.cpp=.o) $(SERVER_NAME)
	-rm -f $(CPP_SERVER:.cpp=.d)

.SUFFIXES: .cpp .c .o


%.o:%.cpp
	$(C++) -c -o $@ $< $(C++FLAGS) 


%.d:%.cpp
	set -e; rm -f $@; $(C++) -MM $< $(C++FLAGS) > $@.$$$$; \
	sed 's,^.*:, $*.o $*.d : ,g' < $@.$$$$ > $@; \
	rm -f $@.$$$$ \


.c.o:
	$(CC) -c -o $*.o $(CCFLAGS) $*.c 

